#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QHeaderView>
#include <QFileDialog>

#include <functional>

/**
 * @brief ICS (Internet Calendaring and Scheduling)
 * 文件是以iCalendar 标准编写的文本文件，可用于共享日历事件信息(标题、摘要、开始时间、结束时间等)，
 * 一般通过电子邮件给他人以共享会议请求或待办事项，收件人可以直接导入到自己的日历软件。
 * iCalendar 是日历数据交换标准，通常以.ics 或 .ifb 为后缀的文本文件保存。
 *
 * https://blog.csdn.net/qq_20623849/article/details/129151465
 * http://www.manongjc.com/detail/56-psfjoxarmujajmg.html
 * https://www.rfc-editor.org/rfc/rfc5545
 */


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    m_pCalenderModel(nullptr)
{
    ui->setupUi(this);

    this->initTableView();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::initTableView() {

    // 添加表头
    m_pCalenderModel = new QStandardItemModel();
    int index = 0;
    m_pCalenderModel->setHorizontalHeaderItem(index, new QStandardItem(QObject::tr("DTSTART")));
    m_pCalenderModel->setHorizontalHeaderItem(++index, new QStandardItem(QObject::tr("DTEND")));
    m_pCalenderModel->setHorizontalHeaderItem(++index, new QStandardItem(QObject::tr("UID")));
    m_pCalenderModel->setHorizontalHeaderItem(++index, new QStandardItem(QObject::tr("SUMMARY")));
    //利用setModel()方法将数据模型与QTableView绑定
    ui->tvContent->setModel(m_pCalenderModel);

    //设置列宽不可变动，即不能通过鼠标拖动增加列宽
       ui->tvContent->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);
       ui->tvContent->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Fixed);
       ui->tvContent->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Fixed);
       ui->tvContent->horizontalHeader()->setSectionResizeMode(3, QHeaderView::Fixed);

       //设置表格的各列的宽度值
       ui->tvContent->setColumnWidth(0,120);
       ui->tvContent->setColumnWidth(1,120);
       ui->tvContent->setColumnWidth(2,300);
       ui->tvContent->setColumnWidth(3,500);

       //默认显示行头，如果你觉得不美观的话，我们可以将隐藏
//       ui->tvContent->verticalHeader()->hide();

       //设置选中时为整行选中
       ui->tvContent->setSelectionBehavior(QAbstractItemView::SelectRows);

       //设置表格的单元为只读属性，即不能编辑
       ui->tvContent->setEditTriggers(QAbstractItemView::NoEditTriggers);

       //如果你用在QTableView中使用右键菜单，需启用该属性
//       ui->tvContent->setContextMenuPolicy(Qt::CustomContextMenu);

       ui->cmbFilePath->clear();

}

void MainWindow::on_btnSelected_clicked()
{
    //定义文件对话框类
        QFileDialog fileDialog;
        //定义文件对话框标题
        fileDialog.setWindowTitle(QStringLiteral("选中ICS文件"));
        //设置默认文件路径
        fileDialog.setDirectory(".");
        //设置文件过滤器
        QStringList filters;
        filters << tr("ICS Files (*.ics)") << tr("Any File(*.*)");
        fileDialog.setNameFilters(filters);
        //设置可以选择多个文件,默认为只能选择一个文件QFileDialog::ExistingFiles
        fileDialog.setFileMode(QFileDialog::ExistingFile);
        //设置视图模式
        fileDialog.setViewMode(QFileDialog::Detail);
        //打印所有选择的文件的路径

        if (fileDialog.exec()) {
            //            fileNames = fileDialog->selectedFiles();
            const auto fileName = fileDialog.selectedFiles().constFirst();
    //       ui->statusbar->addWidget(new QLabel(tr("Current File:") + fileName));
//             ui->statusbar->showMessage(fileName, 5000);
            m_nIndex = 0;
               this->analysisICSData(fileName);
        }
}

void MainWindow::analysisICSData(const QString &fileName) {
    QFile f(fileName);
    if ( f.exists())
    {
        if(ui->cmbFilePath->findText(fileName,  Qt::MatchExactly) == -1) {
               ui->cmbFilePath->addItem(fileName);
        }
        icslib::ICalendar ics(fileName.toStdString());

        std::function<void(icslib::Event *)> cbFunc = std::bind(&MainWindow::DataItemInfo, this, std::placeholders::_1);
        ics.SetDataItemCb(cbFunc);
        ics.LoadFileData();
    }
}

void MainWindow::DataItemInfo(icslib::Event *pEvent) {
    if(pEvent == nullptr && m_pCalenderModel == nullptr) {
        return ;
    }
    m_pCalenderModel->setItem(m_nIndex, 0, new QStandardItem(QString::fromStdString(pEvent->DtStart)));
    m_pCalenderModel->setItem(m_nIndex, 1, new QStandardItem(QString::fromStdString(pEvent->DtEnd)));
    m_pCalenderModel->setItem(m_nIndex, 2, new QStandardItem(QString::fromStdString(pEvent->UID)));
    m_pCalenderModel->setItem(m_nIndex, 3, new QStandardItem(QString::fromStdString(pEvent->Summary)));
    m_nIndex++;

}
